#include "uid_fun.h"
#include "uid_key_flash.h"
#include "rd522_lpcd.h"
#include "iso14443.h"
#include "usart.h"
#include "weigen34.h"
#include "led.h"
#include "buzzer.h"

uid_4byte card_id;
uint8_t uid_f=0,uid[12],cln,sak,status,admin_flag = 0;//读卡使用
uint8_t buf[12],uid_cln;//uid的缓冲数据
extern uint8_t change_admin_uid_flag,wg_flag;
extern int key_flag;//按键状态标志

/**
 * @brief 
 * @param  : 
 * @param  :
 * @retval 
 */
void UID_Status(void)
{
	//判断模块状态
		switch(key_flag)
		{
			case 0:RGBLED_SetValue(4);break;
			case 1:RGBLED_SetValue(4);Delay_ms(100);
					RGBLED_SetValue(0);Delay_ms(100);
					break;
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:RGBLED_SetValue(1);delay_ms(1);break;
		}
		//进入增卡或检卡
		if(admin_flag != 0 )
		{
			RGBLED_SetValue(2);
			delay_ms(1);
		}
		if(wg_flag !=0 )
		{
			RGBLED_SetValue(0);
			delay_ms(1);
		}
}





/**
 * @brief  	读卡片后的操作函数
 * @param  : 
 * @param  :
 * @retval 
 */
void UID_FUN(void)
{
	//	判断是否读卡
	if(uid_f == 1)
	{
		uid_f = 0;
		//重设读卡参数
		rd522_config_analog();
		rd522_set_rate(RATE_106, 10);
		status = pcd_get_card_uid(&cln,uid,&sak);
		if(0x00 == status)
		{
			memcpy(buf,uid,12);//将uid数据放入缓冲数据buf中
			uid_cln = cln;//级联，后续没用到，多数函数需要这个占位参数
			pcd_hlta();
		}
		else
		{
			#if DEBUG
             printf("%d\r\n",(int)status);
            #endif
				
			lpcd_enter();//进入Lpcd
			return;
		}
		UID_COM(&uid_cln,buf);//uid处理
		lpcd_enter();//进入Lpcd
	}
}

/**
 * @brief 将uid【0】改为uid0~3的异或校验
 * @param  uid_cln: uid的级联
 * @param  buf: uid数据
 * @retval 
 */
void UID_Manage(uint8_t *uid_cln ,uint8_t *buf)
{
	uint8_t i;
	//将uid右移一位
	if(uid_cln[0] == 1)
	{
		for(i=0;i<4;i++)
		{
			buf[4-i] = buf[3-i]; 
		}
	}
	buf[0] = 0;
	//将buf[0]变为uid异或校验，后续无用，功能舍弃了
	for(i=1;i<5;i++)
	{
		buf[0] ^= buf[i]; 
	}
	memcpy(card_id.uid_byte,&buf[1],4);//将uid数据存入card.id中方便存入
	#if DEBUG
    for(i=0;i<5;i++) 
	{
		printf("%02x ",buf[i]);
	}
	printf("\r\n");
    #endif
}

/**
 * @brief 获取最后的uid相关数据
 * @param  address:返回的uid片区首地址 
 * @param  u_address:返回的存放uid的首地址
 * @param  dex:返回的最后片区的uid数量
 * @retval 
 */
void Getaddress(uint32_t *address,uint32_t *u_address,uint16_t *dex)
{
	uint16_t lenght;//存放片区uid数
	uint8_t i;//片区标号
	for(i=0;i<UID_FLASH_SIZE/BLOCK_SIZE;i++)
	{
		read_2bytebuf(UID_4BYTE_FIRST+i*BLOCK_SIZE,&lenght,1);
		if(lenght < BLOCK_UID_SIZE)
		{
			*address = (UID_4BYTE_FIRST+i*BLOCK_SIZE);
			*u_address = (*address+22+lenght*4);
			*dex = lenght;
			break;
		}
	}
	if(lenght == BLOCK_UID_SIZE)
	{
		*address = 0;
	}
}

/**
 * @brief  读到uid后的功能操作函数
 * @param  uid_cln: uid级联
 * @param  buf:uid的数据
 * @retval 
 */
void UID_COM(uint8_t *uid_cln ,uint8_t *buf)
{
	/* 
	x_sta 存放判断管理员uid函数的返回值
	block_num 存放判断uid是否存在flash中的返回值，为片区号
	s 存放判断uid是否存在flash中的返回值
	*/
	uint8_t x_sta,block_num,s;
	
	//存放判断uid是否存在flash中的返回值，为uid的标号
	uint16_t index;
	
	//address 后续存放uid片区首地址，后续存放uid地址
	uint32_t address,u_address;
	
	//将uid[0]变成校验位输出uid
	UID_Manage(uid_cln,buf);

	//判断是否为读头模式
	if(wg_flag!=0)
	{
		if(wg_flag == 1)
		{
			WG26_OutPut(&buf[1],1);//韦根26输出
		}
		else if(wg_flag == 2)
		{
			WG34_OutPut(&buf[1],1);//韦根34输出
		}
		SUCCESS_STATUS();
		return;
	}
	
	
	
	//判断是否为管理员uid
	x_sta = IsaddOrsub(uid_cln[0],buf);
	
	
	//判断是否进入修改管理员uid状态
	if(change_admin_uid_flag != 0)
	{
		//判断是否已经存在在flash中
		//级联为1

			s = Compare_4UID(buf,&index,&block_num);

		if(x_sta != 0||s != 0)
		{
			#if DEBUG
            printf("This card is an administrator card or user card ,change failed !\r\n");
			Buzzer_RunMul_Time();
            #else
			ERROR_STATUS();
            #endif
			
		}
		else
		{
			if(change_admin_uid_flag == 1)//修改增加卡
			{
				Change_AdminUid(uid_cln[0],buf,1);
			}
			else//修改减小卡
			{
				Change_AdminUid(uid_cln[0],buf,0);
			}
			#if DEBUG
            printf("change admin uid OK!\r\n");
			Buzzer_RunMul_Time();
            #else
			SUCCESS_STATUS();
            #endif
			change_admin_uid_flag = 0;
			key_flag = 0;
		}
		return;
	}
	
	//
	//
	//
	//
	//为管理员uid
	if(x_sta != 0)
	{
		admin_flag = x_sta;
		if(admin_flag == 1 )
		{
			#if DEBUG
            printf("ADD STATUS\r\n");
            #else
            #endif
		}
		else
		{
			#if DEBUG
            printf("SUB STATUS\r\n");
            #else
            #endif
		}
	}

	
	//不为管理员uid
	else
	{
		//判断是否已经存在在flash中
		//级联为1
		s = Compare_4UID(buf,&index,&block_num);
		//判断管理员uid标志位是否置1或2
		switch(admin_flag)
		{
			case 0://管理员标志位为0，普通挂卡判断是否存在
			{
				if(s == 1)
				{
					#if DEBUG
                    printf("unlock\r\n");
					Buzzer_RunMul_Time();
                    #else
					SUCCESS_STATUS();
                    #endif
					
				}
				else
				{
					#if DEBUG
                    printf("unknown card\r\n");
					Buzzer_RunMul_Time();
                    #else
					ERROR_STATUS();
                    #endif
					
				}
				break;
			}
			case 1://管理员标志为1，加卡
			{
				if(s == 1)//已存在
				{
					#if DEBUG
                    printf("card exist!\r\n");
					Buzzer_RunMul_Time();
                    #else
					ERROR_STATUS();
                    #endif
					
				}
				else//不存在
				{
					//获取加入的uid的索引和片区首地址
					Getaddress(&address,&u_address,&index);
					if(address != 0)
					{
						if(Flash_UID_Write(1,uid_cln[0],u_address,&card_id.uid_buf,index,address)==FLASH_OK)
						{
							#if DEBUG
                            printf("ADD CARD OK!\r\n");
							Buzzer_RunMul_Time();
                            #else
							SUCCESS_STATUS();
                            #endif
							
						}
						else
						{
							#if DEBUG
                            printf("ADD ERROR\r\n");
							Buzzer_RunMul_Time();
                            #else
							ERROR_STATUS();
                            #endif
							
						}
					}
					else
					{
						#if DEBUG
                        printf("%d byte card full\r\n",4);
						Buzzer_RunMul_Time();
                        #else
						ERROR_STATUS();
                        #endif
						
					}
				}
				break;
			}
			
			case 2: //减卡
			{
				if(s==1)//已存在
				{

					address = UID_4BYTE_FIRST+block_num*BLOCK_SIZE;
					u_address = address + (index*4)+22;
					read_2bytebuf(address,&index,1);
					if(Flash_UID_Write(0,uid_cln[0],u_address,&card_id.uid_buf,index,address) == FLASH_OK)
					{
						#if DEBUG
                        printf("SUB CARD OK\r\n");
						Buzzer_RunMul_Time();
                        #else
						SUCCESS_STATUS();
                        #endif
						
					}
					else
					{
						#if DEBUG
                        printf("SUB CARD ERROR!\r\n");
						Buzzer_RunMul_Time();
                        #else
						ERROR_STATUS();
                        #endif
						
					}
				}
				else //不存在
				{
					#if DEBUG
                    printf("card no exist!\r\n");
					Buzzer_RunMul_Time();
                    #else
					ERROR_STATUS();
                    #endif
				}
				break;
			}
			default :
				break;
		}
	}
	
}
//
//
